/**
 * 
 */
package mx.com.asteca.vista;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;

import mx.com.asteca.comun.Constantes;
import mx.com.asteca.comun.dto.AsentamientoDTO;
import mx.com.asteca.comun.dto.DomicilioDTO;
import mx.com.asteca.comun.dto.EstadoDTO;
import mx.com.asteca.comun.dto.InstitutoContactoDTO;
import mx.com.asteca.comun.dto.InstitutoDTO;
import mx.com.asteca.comun.dto.MunicipioDTO;
import mx.com.asteca.comun.dto.PermisosBooleanDTO;
import mx.com.asteca.comun.dto.PersonaDTO;
import mx.com.asteca.fachada.FachadaException;
import mx.com.asteca.fachada.InstitutoFachada;

import org.primefaces.event.SelectEvent;
import org.springframework.util.CollectionUtils;

/**
 * @author JAMARO
 * 
 */
@ManagedBean(name = Constantes.BEAN_INSTITUTOS)
@ViewScoped
public class InstitutoControlador extends BaseController implements
		Serializable {

	private static final String modulo = Constantes.MODULO_INSTITUTO;

	@ManagedProperty("#{institutoFachadaImpl}")
	private transient InstitutoFachada fachada;

	private InstitutoDTO item;

	private InstitutoContactoDTO director;
	private InstitutoContactoDTO representante;
	private PermisosBooleanDTO permisos;
	private String input_editarCalle;
	private String input_editarNoExt;
	private String input_editarNoInt;
	private String input_editarTelefono;
	private String input_editarFax;
	private String input_editarCPAutoComplete;
	private String input_editarDelegacion;
	private String input_editarEntidadFederativa;
	private String input_editarPais;
	private String input_editarIdAsentamientoMunicipioEstado;
	private int input_editarCpIdAsentamiento;

	private List<SelectItem> editarSelectListColonias;
	private List<String> listCPString;
	private List<Integer> listaCPs;

	private String input_editarNombreDirector;
	private String input_editarApellidoPDirector;
	private String input_editarApellidoMDirector;
	private String input_editarPuestoDirector;
	private String input_editarNombreRepresentante;
	private String input_editarApellidoPRepresentante;
	private String input_editarApellidoMRepresentante;
	private String input_editarPuestoRepresentante;

	@PostConstruct
	public void populate() {
		setPermisos(super.stablishSessionPermissions());
	}

	private void initListaCPs() {
		if (CollectionUtils.isEmpty(listaCPs)) {
			try {
				listaCPs = fachada.getDistincCPs();
			} catch (FachadaException e) {
				super.addErrorMessage(Constantes.MESSAGE_TITLE_ERROR,
						Constantes.ERROR_OBTENIENDO_LISTA_CATALOGO);
			}
		}
	}

	private void initListaCPString() {
		if (CollectionUtils.isEmpty(listCPString)) {
			listCPString = new ArrayList<String>();
			for (Integer i : getListaCPs()) {
				String s = String.valueOf(i);
				listCPString.add(s);
			}
		}
	}

	public List<String> complete(String cp) {
		boolean zero = false;
		if (cp.startsWith("0")) {
			cp = cp.substring(1);
			zero = true;
		}
		List<String> results = new ArrayList<String>();
		for (String s : getListCPString()) {
			if (s.startsWith(cp)) {
				if (zero) {
					s = "0" + s;
				}
				results.add(s);
			}
		}
		return results;
	}

	public void handleSelectCambiaCpEditar(SelectEvent e) {
		String selection = e.getObject().toString();
		input_editarCPAutoComplete = selection;
		handlerCambiaCpEditar();
	}

	public void handlerCambiaCpEditar() {
		try {
			if (input_editarCPAutoComplete.startsWith("0")) {
				input_editarCPAutoComplete = input_editarCPAutoComplete
						.substring(1);
			}
			input_editarCpIdAsentamiento = Integer
					.parseInt(input_editarCPAutoComplete);
		} catch (NumberFormatException nex) {
			super.addErrorMessage(Constantes.MESSAGE_TITLE_ERROR,
					Constantes.ERROR_FORMATO_NUMERO);
			return;
		}
		if (input_editarCpIdAsentamiento != 0) {
			// nuevoAlumnoSelectListColonias
			try {
				List<AsentamientoDTO> listaAsentamientos = fachada
						.findAsentamientosByCp(input_editarCpIdAsentamiento);
				// if(listaAsentamientos.size() > 1){
				editarSelectListColonias = new ArrayList<SelectItem>();
				AsentamientoDTO primerResultado = listaAsentamientos.get(0);
				int estadoID = primerResultado.getIdEstado();
				int municipioId = primerResultado.getIdMunicipio();
				EstadoDTO estado = fachada.findEstado(estadoID);
				input_editarPais = estado.getPais();
				MunicipioDTO municipio = fachada.findMunicipio(municipioId,
						estadoID);
				input_editarDelegacion = municipio.getNombre();
				input_editarEntidadFederativa = estado.getNombre();
				for (AsentamientoDTO dto : listaAsentamientos) {
					String llaveTemp = dto.getIdAsentamiento() + "|"
							+ dto.getIdMunicipio() + "|" + dto.getIdEstado();
					SelectItem item = new SelectItem(llaveTemp, dto.getNombre());
					editarSelectListColonias.add(item);
				}
				// }

			} catch (FachadaException e) {
				super.addErrorMessage(Constantes.MESSAGE_TITLE_ERROR,
						Constantes.ERROR_OBTENIENDO_LISTA_CATALOGO);
			}
		}
	}

	/**
	 * @return the permisos
	 */
	public PermisosBooleanDTO getPermisos() {
		return permisos;
	}

	/**
	 * @param permisos
	 *            the permisos to set
	 */
	public void setPermisos(PermisosBooleanDTO permisos) {
		this.permisos = permisos;
		super.setAlta(permisos.isAlta());
		super.setBorrar(permisos.isBorrar());
		super.setCambios(permisos.isEdicion());
		super.setConsulta(permisos.isConsulta());
		super.setImpresion(permisos.isImpresion());
	}

	private void initItem() {
		if (item == null) {
			try {
				List<InstitutoDTO> institutos = fachada.getAll();
				item = institutos.get(0);
				List<InstitutoContactoDTO> list = item.getListContactos();
				InstitutoContactoDTO dto1 = list.get(0);
				InstitutoContactoDTO dto2 = list.get(1);
				if (dto1.getIdPuesto() == 1) {
					director = dto1;
				} else if (dto1.getIdPuesto() == 2) {
					representante = dto1;
				}
				if (dto2.getIdPuesto() == 1) {
					director = dto2;
				} else if (dto2.getIdPuesto() == 2) {
					representante = dto2;
				}
			} catch (FachadaException e) {
				super.addErrorMessage(Constantes.MESSAGE_TITLE_ERROR,
						Constantes.ERROR_OBTENIENDO_LISTA_CATALOGO);
			}
		}
	}

	public void actualizaDatosPersonas() {
		PersonaDTO directorPersona = director.getDtoPersona();
		PersonaDTO representantePersona = representante.getDtoPersona();

		if (input_editarNombreDirector != null
				&& !input_editarNombreDirector.isEmpty()) {
			directorPersona.setNombre(input_editarNombreDirector);
		}
		if (input_editarApellidoPDirector != null
				&& !input_editarApellidoPDirector.isEmpty()) {
			directorPersona.setApellidoP(input_editarApellidoPDirector);
		}
		if (input_editarApellidoMDirector != null
				&& !input_editarApellidoMDirector.isEmpty()) {
			directorPersona.setApellidoM(input_editarApellidoMDirector);
		}
		if (input_editarPuestoDirector != null
				&& !input_editarPuestoDirector.isEmpty()) {
			director.setPuesto(input_editarPuestoDirector);
		}

		if (input_editarNombreRepresentante != null
				&& !input_editarNombreRepresentante.isEmpty()) {
			representantePersona.setNombre(input_editarNombreRepresentante);
		}
		if (input_editarApellidoPRepresentante != null
				&& !input_editarApellidoPRepresentante.isEmpty()) {
			representantePersona
					.setApellidoP(input_editarApellidoPRepresentante);
		}
		if (input_editarApellidoMRepresentante != null
				&& !input_editarApellidoMRepresentante.isEmpty()) {
			representantePersona
					.setApellidoM(input_editarApellidoMRepresentante);
		}
		if (input_editarPuestoRepresentante != null
				&& !input_editarPuestoRepresentante.isEmpty()) {
			representante.setPuesto(input_editarPuestoRepresentante);
		}

		director.setDtoPersona(directorPersona);
		representante.setDtoPersona(representantePersona);
		try {
			fachada.updateContactos(director, representante);
			super.addInfoMessage(Constantes.ACCION_UPDATE_REGISTRO_EXITOSO_MENSAJE);
			addBitacora(Constantes.ACCION_UPDATE_REGISTRO,
					Constantes.ACCION_UPDATE_REGISTRO_EXITOSO_MENSAJE);
			input_editarNombreDirector = "";
			input_editarApellidoPDirector = "";
			input_editarApellidoMDirector = "";
			input_editarPuestoDirector = "";
			input_editarNombreRepresentante = "";
			input_editarApellidoPRepresentante = "";
			input_editarApellidoMRepresentante = "";
			input_editarPuestoRepresentante = "";
		} catch (FachadaException e) {
			super.addErrorMessage(Constantes.MESSAGE_TITLE_ERROR,
					Constantes.ERROR_UPDATE_REGISTRO);
			addBitacora(Constantes.ACCION_UPDATE_REGISTRO,
					Constantes.ACCION_UPDATE_REGISTRO_FALLIDO_MENSAJE);
		}
	}

	public void actualizaDatosBasicos() {
		String nombre = item.getNombre();
		String razonSoc = item.getRazonSocial();
		String rfc = item.getRfc();
		initItem();
		item.setNombre(nombre);
		item.setRazonSocial(razonSoc);
		item.setRfc(rfc);
		try {
			fachada.update(item);
			super.addInfoMessage(Constantes.MESSAGE_TITLE_INFO,
					Constantes.ACCION_UPDATE_REGISTRO_EXITOSO_MENSAJE);
			addBitacora(Constantes.ACCION_UPDATE_REGISTRO,
					Constantes.ACCION_UPDATE_REGISTRO_EXITOSO_MENSAJE);
			initItem();
		} catch (FachadaException e) {
			super.addErrorMessage(Constantes.MESSAGE_TITLE_ERROR,
					Constantes.ERROR_UPDATE_REGISTRO);
			addBitacora(Constantes.ACCION_UPDATE_REGISTRO,
					Constantes.ACCION_UPDATE_REGISTRO_FALLIDO_MENSAJE);
		}
	}

	public void updateDomicilio() {
		DomicilioDTO domicilioDTO = item.getDtoDomicilio();
		if (domicilioDTO == null) {
			domicilioDTO = new DomicilioDTO();
		}
		if (input_editarCalle != null && !input_editarCalle.isEmpty()) {
			domicilioDTO.setCalle(input_editarCalle);
		}
		if (input_editarCpIdAsentamiento != 0) {
			domicilioDTO.setCp(input_editarCpIdAsentamiento);
		}
		if (input_editarIdAsentamientoMunicipioEstado != null
				&& !input_editarIdAsentamientoMunicipioEstado.isEmpty()) {
			String[] datosDemograficos = input_editarIdAsentamientoMunicipioEstado
					.split("\\|");
			int idAsentamientoTemp = Integer.parseInt(datosDemograficos[0]);
			int idMunicipioTemp = Integer.parseInt(datosDemograficos[1]);
			int idEstadoTemp = Integer.parseInt(datosDemograficos[2]);
			domicilioDTO.setIdAsentamiento(idAsentamientoTemp);
			domicilioDTO.setIdEstado(idEstadoTemp);
			domicilioDTO.setIdMunicipio(idMunicipioTemp);
		}
		if (input_editarNoExt != null && !input_editarNoExt.isEmpty()) {
			domicilioDTO.setNoExterior(input_editarNoExt);
		}
		if (input_editarNoInt != null && !input_editarNoInt.isEmpty()) {
			domicilioDTO.setNoInterior(input_editarNoInt);
		}
		if (input_editarTelefono != null && !input_editarTelefono.isEmpty()) {
			domicilioDTO.setTelefono(input_editarTelefono);
		}
		if (input_editarFax != null && !input_editarFax.isEmpty()) {
			domicilioDTO.setFax(input_editarFax);
		}
		try {
			fachada.updateDomicilio(domicilioDTO);
			item.setDtoDomicilio(domicilioDTO);
			addBitacora(Constantes.ACCION_UPDATE_REGISTRO,
					Constantes.ACCION_UPDATE_REGISTRO_EXITOSO_MENSAJE);
			super.addInfoMessage(Constantes.ACCION_UPDATE_REGISTRO_EXITOSO_MENSAJE);
		} catch (FachadaException e) {
			super.addErrorMessage(Constantes.ERROR_UPDATE_REGISTRO);
			addBitacora(Constantes.ACCION_UPDATE_REGISTRO,
					Constantes.ACCION_UPDATE_REGISTRO_FALLIDO_MENSAJE);
		}
	}

	/**
	 * @return the item
	 */
	public InstitutoDTO getItem() {
		initItem();
		return item;
	}

	/**
	 * @param item
	 *            the item to set
	 */
	public void setItem(InstitutoDTO item) {
		this.item = item;
	}

	/**
	 * @return the fachada
	 */
	public InstitutoFachada getFachada() {
		return fachada;
	}

	/**
	 * @return the director
	 */
	public InstitutoContactoDTO getDirector() {
		return director;
	}

	/**
	 * @param director
	 *            the director to set
	 */
	public void setDirector(InstitutoContactoDTO director) {
		this.director = director;
	}

	/**
	 * @return the representante
	 */
	public InstitutoContactoDTO getRepresentante() {
		return representante;
	}

	/**
	 * @param representante
	 *            the representante to set
	 */
	public void setRepresentante(InstitutoContactoDTO representante) {
		this.representante = representante;
	}

	/**
	 * @param fachada
	 *            the fachada to set
	 */
	public void setFachada(InstitutoFachada fachada) {
		this.fachada = fachada;
	}

	@Override
	String getModulo() {
		return modulo;
	}

	/**
	 * @return the input_editarCalle
	 */
	public String getInput_editarCalle() {
		return input_editarCalle;
	}

	/**
	 * @param input_editarCalle
	 *            the input_editarCalle to set
	 */
	public void setInput_editarCalle(String input_editarCalle) {
		this.input_editarCalle = input_editarCalle;
	}

	/**
	 * @return the input_editarNoExt
	 */
	public String getInput_editarNoExt() {
		return input_editarNoExt;
	}

	/**
	 * @param input_editarNoExt
	 *            the input_editarNoExt to set
	 */
	public void setInput_editarNoExt(String input_editarNoExt) {
		this.input_editarNoExt = input_editarNoExt;
	}

	/**
	 * @return the input_editarNoInt
	 */
	public String getInput_editarNoInt() {
		return input_editarNoInt;
	}

	/**
	 * @param input_editarNoInt
	 *            the input_editarNoInt to set
	 */
	public void setInput_editarNoInt(String input_editarNoInt) {
		this.input_editarNoInt = input_editarNoInt;
	}

	/**
	 * @return the input_editarCPAutoComplete
	 */
	public String getInput_editarCPAutoComplete() {
		return input_editarCPAutoComplete;
	}

	/**
	 * @param input_editarCPAutoComplete
	 *            the input_editarCPAutoComplete to set
	 */
	public void setInput_editarCPAutoComplete(String input_editarCPAutoComplete) {
		this.input_editarCPAutoComplete = input_editarCPAutoComplete;
	}

	/**
	 * @return the input_editarDelegacion
	 */
	public String getInput_editarDelegacion() {
		return input_editarDelegacion;
	}

	/**
	 * @param input_editarDelegacion
	 *            the input_editarDelegacion to set
	 */
	public void setInput_editarDelegacion(String input_editarDelegacion) {
		this.input_editarDelegacion = input_editarDelegacion;
	}

	/**
	 * @return the input_editarEntidadFederativa
	 */
	public String getInput_editarEntidadFederativa() {
		return input_editarEntidadFederativa;
	}

	/**
	 * @param input_editarEntidadFederativa
	 *            the input_editarEntidadFederativa to set
	 */
	public void setInput_editarEntidadFederativa(
			String input_editarEntidadFederativa) {
		this.input_editarEntidadFederativa = input_editarEntidadFederativa;
	}

	/**
	 * @return the input_editarPais
	 */
	public String getInput_editarPais() {
		return input_editarPais;
	}

	/**
	 * @param input_editarPais
	 *            the input_editarPais to set
	 */
	public void setInput_editarPais(String input_editarPais) {
		this.input_editarPais = input_editarPais;
	}

	/**
	 * @return the input_editarIdAsentamientoMunicipioEstado
	 */
	public String getInput_editarIdAsentamientoMunicipioEstado() {
		return input_editarIdAsentamientoMunicipioEstado;
	}

	/**
	 * @param input_editarIdAsentamientoMunicipioEstado
	 *            the input_editarIdAsentamientoMunicipioEstado to set
	 */
	public void setInput_editarIdAsentamientoMunicipioEstado(
			String input_editarIdAsentamientoMunicipioEstado) {
		this.input_editarIdAsentamientoMunicipioEstado = input_editarIdAsentamientoMunicipioEstado;
	}

	/**
	 * @return the input_editarCpIdAsentamiento
	 */
	public int getInput_editarCpIdAsentamiento() {
		return input_editarCpIdAsentamiento;
	}

	/**
	 * @param input_editarCpIdAsentamiento
	 *            the input_editarCpIdAsentamiento to set
	 */
	public void setInput_editarCpIdAsentamiento(int input_editarCpIdAsentamiento) {
		this.input_editarCpIdAsentamiento = input_editarCpIdAsentamiento;
	}

	/**
	 * @return the editarSelectListColonias
	 */
	public List<SelectItem> getEditarSelectListColonias() {
		return editarSelectListColonias;
	}

	/**
	 * @param editarSelectListColonias
	 *            the editarSelectListColonias to set
	 */
	public void setEditarSelectListColonias(
			List<SelectItem> editarSelectListColonias) {
		this.editarSelectListColonias = editarSelectListColonias;
	}

	/**
	 * @return the listCPString
	 */
	public List<String> getListCPString() {
		initListaCPString();
		return listCPString;
	}

	/**
	 * @param listCPString
	 *            the listCPString to set
	 */
	public void setListCPString(List<String> listCPString) {
		this.listCPString = listCPString;
	}

	/**
	 * @return the listaCPs
	 */
	public List<Integer> getListaCPs() {
		initListaCPs();
		return listaCPs;
	}

	/**
	 * @param listaCPs
	 *            the listaCPs to set
	 */
	public void setListaCPs(List<Integer> listaCPs) {
		this.listaCPs = listaCPs;
	}

	/**
	 * @return the input_editarTelefono
	 */
	public String getInput_editarTelefono() {
		return input_editarTelefono;
	}

	/**
	 * @param input_editarTelefono
	 *            the input_editarTelefono to set
	 */
	public void setInput_editarTelefono(String input_editarTelefono) {
		this.input_editarTelefono = input_editarTelefono;
	}

	/**
	 * @return the input_editarFax
	 */
	public String getInput_editarFax() {
		return input_editarFax;
	}

	/**
	 * @param input_editarFax
	 *            the input_editarFax to set
	 */
	public void setInput_editarFax(String input_editarFax) {
		this.input_editarFax = input_editarFax;
	}

	/**
	 * @return the input_editarNombreDirector
	 */
	public String getInput_editarNombreDirector() {
		return input_editarNombreDirector;
	}

	/**
	 * @param input_editarNombreDirector the input_editarNombreDirector to set
	 */
	public void setInput_editarNombreDirector(String input_editarNombreDirector) {
		this.input_editarNombreDirector = input_editarNombreDirector;
	}

	/**
	 * @return the input_editarApellidoPDirector
	 */
	public String getInput_editarApellidoPDirector() {
		return input_editarApellidoPDirector;
	}

	/**
	 * @param input_editarApellidoPDirector the input_editarApellidoPDirector to set
	 */
	public void setInput_editarApellidoPDirector(
			String input_editarApellidoPDirector) {
		this.input_editarApellidoPDirector = input_editarApellidoPDirector;
	}

	/**
	 * @return the input_editarApellidoMDirector
	 */
	public String getInput_editarApellidoMDirector() {
		return input_editarApellidoMDirector;
	}

	/**
	 * @param input_editarApellidoMDirector the input_editarApellidoMDirector to set
	 */
	public void setInput_editarApellidoMDirector(
			String input_editarApellidoMDirector) {
		this.input_editarApellidoMDirector = input_editarApellidoMDirector;
	}

	/**
	 * @return the input_editarPuestoDirector
	 */
	public String getInput_editarPuestoDirector() {
		return input_editarPuestoDirector;
	}

	/**
	 * @param input_editarPuestoDirector the input_editarPuestoDirector to set
	 */
	public void setInput_editarPuestoDirector(String input_editarPuestoDirector) {
		this.input_editarPuestoDirector = input_editarPuestoDirector;
	}

	/**
	 * @return the input_editarNombreRepresentante
	 */
	public String getInput_editarNombreRepresentante() {
		return input_editarNombreRepresentante;
	}

	/**
	 * @param input_editarNombreRepresentante the input_editarNombreRepresentante to set
	 */
	public void setInput_editarNombreRepresentante(
			String input_editarNombreRepresentante) {
		this.input_editarNombreRepresentante = input_editarNombreRepresentante;
	}

	/**
	 * @return the input_editarApellidoPRepresentante
	 */
	public String getInput_editarApellidoPRepresentante() {
		return input_editarApellidoPRepresentante;
	}

	/**
	 * @param input_editarApellidoPRepresentante the input_editarApellidoPRepresentante to set
	 */
	public void setInput_editarApellidoPRepresentante(
			String input_editarApellidoPRepresentante) {
		this.input_editarApellidoPRepresentante = input_editarApellidoPRepresentante;
	}

	/**
	 * @return the input_editarApellidoMRepresentante
	 */
	public String getInput_editarApellidoMRepresentante() {
		return input_editarApellidoMRepresentante;
	}

	/**
	 * @param input_editarApellidoMRepresentante the input_editarApellidoMRepresentante to set
	 */
	public void setInput_editarApellidoMRepresentante(
			String input_editarApellidoMRepresentante) {
		this.input_editarApellidoMRepresentante = input_editarApellidoMRepresentante;
	}

	/**
	 * @return the input_editarPuestoRepresentante
	 */
	public String getInput_editarPuestoRepresentante() {
		return input_editarPuestoRepresentante;
	}

	/**
	 * @param input_editarPuestoRepresentante the input_editarPuestoRepresentante to set
	 */
	public void setInput_editarPuestoRepresentante(
			String input_editarPuestoRepresentante) {
		this.input_editarPuestoRepresentante = input_editarPuestoRepresentante;
	}

}
